/*******************************************************************************
 * Classe Fenetre : classe de création de la fenetre prinipal du programme qui
 *                  contient les panneaux des écrans
 ******************************************************************************/
package tp2;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author W&G
 */
public class Fenetre extends JFrame {

    // Panneau conteneur
    private JPanel pnlConteneur = new JPanel();
    // Panneau contenant les règles du jeu
    private ReglesDuJeu pnlReglesDuJeu;
    // Panneau du menu principal
    private MenuPrincipal pnlMenuPrincipal;
    // Panneau des statistiques
    private Statistiques pnlStatistiques;
    // Panneau de l'à propos
    private APropos pnlAPropos;
    // Panneau du jeu
    private Jeu pnlJeu;
    // Panneau Sauvegarder
    private Sauvegarder pnlSauvegarder;
    // Panneau Charger
    private Charger pnlCharger;
    // Le panneau affiché dans le moment
    private JPanel pnlCourant;
    // Couleur de fond
    private Color fond = new Color(140, 0, 0);
    // Barre de menu de la fenêtre
    private MenuBar monMenu = new MenuBar();
    // Menu fichier
    private Menu mnuFichier = new Menu("Fichier");
    // Menu aide
    private Menu mnuAide = new Menu("?");
    // Bouton Quitter
    private MenuItem itmQuitter = new MenuItem("Quitter");
    // Bouton qui renvoie à l'écran À propos
    private MenuItem itmAPropos = new MenuItem("À propos");
    // Bouton qui commence une nouvelle partie
    private MenuItem itmNouvellePartie = new MenuItem("Nouvelle partie");
    // Bouton pour charger une partie
    private MenuItem itmOuvrirPartie = new MenuItem("Ouvrir partie...");
    // Bouton pour sauvegarder une partie
    private MenuItem itmSauvegarder = new MenuItem("Sauvegarder...");
    // Bouton pour afficher les statistiques
    private MenuItem itmStatistiques = new MenuItem("Statistiques");
    // Bouton qui renvoie aux règles du jeu
    private MenuItem itmAide = new MenuItem("Aide");
    // ActionListener sur les boutons
    private BoutonPresse monBoutonPresse = new BoutonPresse();

    public Fenetre() {
        super("Redd le rond cool et culturé");
        // Ajoute tous les éléments de la fenêtre
        ajouterElements();
    }

    // Méthode qui ajoute tous les éléments à la fenêtre
    private void ajouterElements() {
        // Crée les différents écrans
        pnlReglesDuJeu = new ReglesDuJeu(this);
        pnlMenuPrincipal = new MenuPrincipal(this);
        pnlAPropos = new APropos(this);
        pnlJeu = new Jeu(this);
        pnlStatistiques = new Statistiques(this);
        pnlSauvegarder = new Sauvegarder(this);
        pnlCharger = new Charger(this);

        // Ajoute les éléments aux menus de la menubar
        mnuFichier.add(itmNouvellePartie);
        mnuFichier.add(itmOuvrirPartie);
        mnuFichier.add(itmSauvegarder);
        mnuFichier.addSeparator();
        mnuFichier.add(itmQuitter);
        mnuAide.add(itmAide);
        mnuAide.add(itmStatistiques);
        mnuAide.addSeparator();
        mnuAide.add(itmAPropos);
        monMenu.add(mnuFichier);
        monMenu.add(mnuAide);

        // ActionListeners sur les boutons des menus
        itmNouvellePartie.addActionListener(monBoutonPresse);
        itmOuvrirPartie.addActionListener(monBoutonPresse);
        itmSauvegarder.addActionListener(monBoutonPresse);
        itmQuitter.addActionListener(monBoutonPresse);
        itmAide.addActionListener(monBoutonPresse);
        itmStatistiques.addActionListener(monBoutonPresse);
        itmAPropos.addActionListener(monBoutonPresse);

        this.setMenuBar(monMenu);

        // Couleur de fond sur les panneaux
        pnlConteneur.setBackground(fond);
        pnlMenuPrincipal.setBackground(fond);
        pnlReglesDuJeu.setBackground(fond);
        pnlJeu.setBackground(fond);
        pnlAPropos.setBackground(fond);

        // Affichage du menu principal
        afficherMenuPrincipal();

        // Modification des propriétés de la fenêtre
        this.add(pnlConteneur);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setVisible(true);
    }

    /* Les méthodes suivantes affichent respectivement les règles du jeu,
     * le menu principal, l'à propos, le jeu, les statistiques, l'écran
     * de sauvegarde et l'écran de chargement. Le paramètre quitter sur
     * plusieurs d'entre elles dit si l'écran affiché renverra au jeu ou
     * au menu principal lorsqu'on cliquera sur le bouton Retour */

    public void afficherReglesDuJeu(boolean quitter) {
        pnlConteneur.removeAll();
        pnlConteneur.add(pnlReglesDuJeu);
        pnlConteneur.revalidate();
        pnlConteneur.repaint();
        pnlReglesDuJeu.setRetour(quitter);
        pnlCourant = (JPanel) pnlReglesDuJeu;
    }

    public void afficherMenuPrincipal() {
        pnlConteneur.removeAll();
        pnlConteneur.add(pnlMenuPrincipal);
        pnlConteneur.revalidate();
        pnlConteneur.repaint();
        pnlCourant = (JPanel) pnlMenuPrincipal;
    }

    public void afficherAPropos(boolean quitter) {
        pnlConteneur.removeAll();
        pnlConteneur.add(pnlAPropos);
        pnlConteneur.revalidate();
        pnlConteneur.repaint();
        pnlAPropos.setRetour(quitter);
        pnlCourant = (JPanel) pnlAPropos;
    }

    public void afficherJeu() {
        pnlConteneur.removeAll();
        pnlConteneur.add(pnlJeu);
        pnlConteneur.revalidate();
        pnlConteneur.repaint();
        pnlCourant = (JPanel) pnlJeu;
    }

    public void afficherStatistiques(boolean quitter) {
        pnlConteneur.removeAll();
        pnlConteneur.add(pnlStatistiques);
        pnlConteneur.revalidate();
        pnlConteneur.repaint();
        pnlStatistiques.setRetour(quitter);
        pnlCourant = (JPanel) pnlStatistiques;
    }

    public void afficherSauvegarder(boolean quitter, boolean resetter) {
        pnlConteneur.removeAll();
        pnlConteneur.add(pnlSauvegarder);
        pnlConteneur.revalidate();
        pnlConteneur.repaint();
        pnlSauvegarder.setRetour(quitter);
        pnlSauvegarder.setResetter(resetter);
        pnlCourant = (JPanel) pnlSauvegarder;
    }

    public void afficherCharger(boolean quitter) {
        pnlConteneur.removeAll();
        pnlConteneur.add(pnlCharger);
        pnlConteneur.revalidate();
        pnlConteneur.repaint();
        pnlCharger.setRetour(quitter);
        pnlCourant = (JPanel) pnlCharger;
    }
    // Méthode get pour la couleur de fond
    public Color getFond() {
        return fond;
    }
    // Ajoute une victoire pour un joueur aux statistiques
    public void ajouterVictoire(Jeu.Joueur j)
    {
        pnlStatistiques.ajouterVictoire(j);
    }


    // Classe interne de gestion des clics sur les boutons
    public class BoutonPresse implements ActionListener {
        public void actionPerformed(ActionEvent ae) {
            if (ae.getSource() == itmQuitter) {
                System.exit(0);
            }
            if (ae.getSource() == itmNouvellePartie) {
                afficherJeu();
                Jeu.mettreAZero();
            }
            if (ae.getSource() == itmOuvrirPartie) {
                if (pnlCourant == pnlJeu) {
                    afficherCharger(true);
                } else {
                    afficherCharger(false);
                }
            }
            if (ae.getSource() == itmSauvegarder) {
                if (pnlCourant == pnlJeu) {
                    afficherSauvegarder(true, false);
                } else {
                    afficherSauvegarder(false, false);
                }
            }
            if (ae.getSource() == itmAide) {
                if (pnlCourant == pnlJeu) {
                    afficherReglesDuJeu(true);
                } else {
                    afficherReglesDuJeu(false);
                }
            }
            if (ae.getSource() == itmStatistiques) {
                if (pnlCourant == pnlJeu) {
                    afficherStatistiques(true);
                } else {
                    afficherStatistiques(false);
                }
            }
            if (ae.getSource() == itmAPropos) {
                if (pnlCourant == pnlJeu) {
                    afficherAPropos(true);
                } else {
                    afficherAPropos(false);
                }
            }
        }
    }
//Retourne le panneau cconteneur
    public JPanel getPnlConteneur() {
        return pnlConteneur;
    }
}
